package com.muyu.common.security.utils;

import com.aliyun.cloudauth20190307.Client;
import com.aliyun.cloudauth20190307.models.InitFaceVerifyRequest;
import com.aliyun.cloudauth20190307.models.InitFaceVerifyResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.muyu.common.core.constant.AlibabaAccessKey;
import com.muyu.common.core.domain.Result;

import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class InitFaceVerify {

//    public static void main(String[] args) throws Exception {
//        String name = "杨乐";
//        String idCard = "142623200305094914";
//
//        // 调用方法进行人脸认证初始化
//        Result result = initializeFaceVerify(name, idCard);
//
//        // 输出认证信息
//        System.out.println("认证ID: " + result.toString());
//    }
    public static Result initializeFaceVerify(String name, String idCard) throws Exception {
        // 创建请求对象
        InitFaceVerifyRequest request = new InitFaceVerifyRequest();

        // 设置场景ID和商户请求唯一标识
        request.setSceneId(Long.valueOf(1000012276));
        request.setOuterOrderNo(generateOuterOrderNo());

        // 设置认证方案和模式
        request.setProductCode("ID_PRO");
        request.setModel("PHOTINUS_LIVENESS");

        // 设置证件类型、姓名和证件号码
        request.setCertType("IDENTITY_CARD");
        request.setCertName(name);
        request.setCertNo(idCard);

        // 设置MetaInfo环境参数（可以根据需要进行修改）
        request.setMetaInfo("{}");

        // 发送请求并获取响应
        InitFaceVerifyResponse response = initFaceVerifyAutoRoute(request);

        // 返回认证ID
        if (response.getBody().getResultObject().getCertifyId() != null) {
            return Result.success(response.getBody().getResultObject().getCertifyId(), "认证成功");
        } else {
            return Result.error( response.getBody().getResultObject().getCertifyId(),"认证失败或未获取到认证ID");
        }
    }

    // 生成唯一的 OuterOrderNo，长度为32
    public static String generateOuterOrderNo() {
        // 获取当前时间戳（毫秒），转换为16位十六进制字符串
        String timestamp = Long.toHexString(System.currentTimeMillis());

        // 生成一个4位的随机字母数字组合
        String randomPart = generateRandomString(12);

        // 拼接时间戳和随机字符串，确保总长度为32
        String outerOrderNo = timestamp + randomPart;

        // 确保总长度为32，截取或者填充
        return outerOrderNo.length() > 32 ? outerOrderNo.substring(0, 32) : outerOrderNo;
    }

    // 生成指定长度的随机字母数字字符串
    private static String generateRandomString(int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder sb = new StringBuilder(length);
        Random random = new Random();

        for (int i = 0; i < length; i++) {
            int randomIndex = random.nextInt(characters.length());
            sb.append(characters.charAt(randomIndex));
        }

        return sb.toString();
    }
    private static InitFaceVerifyResponse initFaceVerifyAutoRoute(InitFaceVerifyRequest request) {
        // 第一个为主区域Endpoint，第二个为备区域Endpoint。
        List<String> endpoints = Arrays.asList("cloudauth.cn-shanghai.aliyuncs.com", "cloudauth.cn-beijing.aliyuncs.com");
        InitFaceVerifyResponse lastResponse = null;
        for (int i=0; i<endpoints.size(); i++) {
            try {
                InitFaceVerifyResponse response = initFaceVerify(endpoints.get(i), request);
                lastResponse = response;

                // 服务端错误，切换到下个区域调用。
                if(response != null){
                    if(500 == response.getStatusCode()){
                        continue;
                    }
                    if(response.getBody() != null){
                        if("500".equals(response.getBody().getCode())){
                            continue;
                        }
                    }
                }

                // 正常返回
                return lastResponse;
            }catch (Exception e) {
                e.printStackTrace();
                if(i == endpoints.size()-1){
                    throw new RuntimeException(e);
                }
            }
        }

        return lastResponse;
    }

    private static InitFaceVerifyResponse initFaceVerify(String endpoint, InitFaceVerifyRequest request)
            throws Exception {

        // 阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
        // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
        // 本示例通过阿里云Credentials工具从环境变量中读取AccessKey，来实现API访问的身份验证。如何配置环境变量，请参见https://help.aliyun.com/document_detail/378657.html。
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
        Config config = new Config();
        // 设置 AccessKeyId 和 AccessKeySecret
        config.setAccessKeyId(AlibabaAccessKey.ACCESS_KEY_ID);

        config.setAccessKeySecret(AlibabaAccessKey.ACCESS_KEY_SECRET);

        // 设置其他配置项，如 endpoint 等
        config.setEndpoint("cloudauth.cn-shanghai.aliyuncs.com");
        config.setCredential(credentialClient);
        config.setEndpoint(endpoint);
        // 设置http代理。
        //config.setHttpProxy("http://xx.xx.xx.xx:xxxx");
        // 设置https代理。
        //config.setHttpsProxy("https://xx.xx.xx.xx:xxxx");
        Client client = new Client(config);

        // 创建RuntimeObject实例并设置运行参数。
        RuntimeOptions runtime = new RuntimeOptions();
        runtime.readTimeout = 10000;
        runtime.connectTimeout = 10000;

        return client.initFaceVerifyWithOptions(request, runtime);
    }

}